﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ElevenCore;
using ElevenGUI;
using ElevenGlobal;

namespace ElevenGUI
{
    public partial class FrmClientes : Form
    {

        private DataTable dtProvPaises;
        private DataTable dtProvProvincias;
        private DataTable dtProvCantones;
        private DataTable dtProvDistritos;

        private GLOBuscador buscador;

        public FrmClientes()
        {
            InitializeComponent();
        }

        private void FrmProveedores_Load(object sender, EventArgs e)
        {
            cargarComboBox();
        }

        #region Métodos Carga de Datos

        private void cargarComboBox()
        {
            try
            {
                cargarComboBoxPais();
                cargarComboBoxProvincia();
                cargarComboBoxCanton();
                cargarComboBoxDistritos();
            }
            catch (Exception) { }
        }

        private void cargarComboBoxPais()
        {
            dtProvPaises = GENPais.consultar();
            cbProvPais.DataSource = dtProvPaises;
            cbProvPais.DisplayMember = "Nombre";
            cbProvPais.ValueMember = "IdPais";
        }

        private void cargarComboBoxProvincia()
        {
            try
            {
                cbProvProvincia.DataSource = new DataTable();
                cbProvCanton.DataSource = new DataTable();
                cbProvDistrito.DataSource = new DataTable();
                dtProvProvincias = GENProvincia.consultar(int.Parse(cbProvPais.SelectedValue.ToString()));
                cbProvProvincia.DataSource = dtProvProvincias;
                cbProvProvincia.DisplayMember = "Nombre";
                cbProvProvincia.ValueMember = "IdProvincia";
            }
            catch (FormatException) { }
        }

        private void cargarComboBoxCanton()
        {
            try
            {
                cbProvCanton.DataSource = new DataTable();
                dtProvCantones = GENCanton.consultar(int.Parse(cbProvProvincia.SelectedValue.ToString()));
                cbProvCanton.DataSource = dtProvCantones;
                cbProvCanton.DisplayMember = "Nombre";
                cbProvCanton.ValueMember = "IdCanton";
            }
            catch (FormatException) { }
        }

        private void cargarComboBoxDistritos()
        {
            try
            {
                cbProvDistrito.DataSource = new DataTable();
                dtProvDistritos = GENDistrito.consultar(int.Parse(cbProvCanton.SelectedValue.ToString()));
                cbProvDistrito.DataSource = dtProvDistritos;
                cbProvDistrito.DisplayMember = "Nombre";
                cbProvDistrito.ValueMember = "IdDistrito";
            }
            catch (FormatException) { }
        }

        private void habilitar(bool Enable)
        {
            txtCedula.Enabled = Enable;
            txtNombre.Enabled = Enable;
            txtApellido1.Enabled = Enable;
            txtApellido2.Enabled = Enable;
            txtDireccion.Enabled = Enable;
            txtCorreo.Enabled = Enable;
            txtRegion.Enabled = Enable;
            cbxEditarRegion.Enabled = Enable;
            cbProvPais.Enabled = Enable;
            cbProvProvincia.Enabled = Enable;
            cbProvCanton.Enabled = Enable;
            cbProvDistrito.Enabled = Enable;
            txtTel.Enabled = Enable;
            txtTel2.Enabled = Enable;
            txtCel.Enabled = Enable;
        }

        private void limpiar()
        {
            txtID.Text = "";
            txtCorreo.Text = "";
            txtApellido2.Text = "";
            txtCedula.Text = "";
            txtNombre.Text = "";
            txtApellido1.Text = "";
            txtDireccion.Text = "";
            txtRegion.Text = "";
            txtTel.Text = "";
            txtTel2.Text = "";
            txtCel.Text = "";
        }

        #endregion

        #region Eventos ComboBox

        private void cbProvPais_SelectedIndexChanged(object sender, EventArgs e)
        {
            cargarComboBoxProvincia();
        }

        private void cbProvCanton_SelectedIndexChanged(object sender, EventArgs e)
        {
            cargarComboBoxDistritos();
        }

        private void cbProvProvincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            cargarComboBoxCanton();
        }

        #endregion

        #region Eventos Botones

        private void btnNuevoProv_Click(object sender, EventArgs e)
        {
            btnBuscar.Enabled = false;
            limpiar();
            habilitar(true);
            txtCedula.Focus();
            cargarComboBox();
            btnNuevo.Enabled = false;
            btnEliminar.Enabled = false;
            btnCancelar.Enabled = true;
        }

        private void btnCancelarProv_Click(object sender, EventArgs e)
        {
            btnBuscar.Enabled = true;
            habilitar(false);
            btnNuevo.Enabled = true;
            btnEliminar.Enabled = true;
            btnCancelar.Enabled = false;
        }

        private void btnGuardarProv_Click(object sender, EventArgs e)
        {
            if (!btnCancelar.Enabled)
            {
                try
                {
                    DataRowView dr2 = (DataRowView)(cbProvDistrito.SelectedItem);
                    int distrito;
                    if (!cbxEditarRegion.Checked)
                    {
                        distrito = -1;
                    }
                    else
                    {
                        distrito = int.Parse(dr2["IdDistrito"].ToString());
                    }
                    POSCliente cliente = new POSCliente(int.Parse(txtID.Text), txtCedula.Text, txtApellido1.Text
                        , txtApellido2.Text, txtNombre.Text, txtDireccion.Text, distrito, txtTel.Text, txtTel2.Text, txtCel.Text
                        , txtCorreo.Text);
                    cliente.modificar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Cliente actualizado con éxito");
                    mensaje.ShowDialog();
                }
                catch (NullReferenceException ne)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "Para actualizar un cliente debe elegir uno de la lista de clientes a la izquierda.\n Si desea crear uno nuevo de click en el botón \"Nuevo\". " +
                        "\n\n Si eligió uno debe elegir un distrito.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                    error.ShowDialog();
                }
                catch (ValidadorException ve)
                {
                    GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Por favor revise los datos, ya que alguno está en algún formato incorrecto.\n\n Mensaje técnico del error: " + ve.Message, "ValidadorException");
                    error.ShowDialog();
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + se.Message, "SqlException");
                    error.ShowDialog();
                }
                catch (FormatException fe)
                {
                    GLOMensajeError error = new GLOMensajeError("No se eligió un cliente.", "Debe buscar el cliente que desea actualizar oprimiendo el botón de buscar (binoculares).\n"
                    + "Si desea agregar un cliente nuevo de click en nuevo.\n\n Mensaje técnico del error: " + fe.Message, "FormatException");
                    error.ShowDialog();
                }
            }
            else
            {
                try
                {
                    DataRowView dr = (DataRowView)(cbProvDistrito.SelectedItem);
                    POSCliente cliente = new POSCliente(0, txtCedula.Text, txtApellido1.Text
                        , txtApellido2.Text, txtNombre.Text, txtDireccion.Text, int.Parse(dr["IdDistrito"].ToString())
                        , txtTel.Text, txtTel2.Text, txtCel.Text, txtCorreo.Text);
                    cliente.insertar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Cliente insertado con éxito");
                    mensaje.ShowDialog();
                    limpiar();
                    btnCancelar.PerformClick();
                }
                catch (ValidadorException ve)
                {
                    GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Por favor revise los datos, ya que alguno está en algún formato incorrecto\n\n Mensaje técnico del error: " + ve.Message, "ValidadorException");
                    error.ShowDialog();
                }
                catch (NullReferenceException ne)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe escoger país, provincia, cantón y distrito donde se encuentra el cliente.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                    error.ShowDialog();
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + se.Message, "SqlException");
                    error.ShowDialog();
                }
            }
        }

        private void btnEliminarProv_Click(object sender, EventArgs e)
        {
            try
            {
                POSCliente cliente = new POSCliente(int.Parse(txtID.Text), "", "", "", "N", "", 0, "", "", "", "");

                if (cliente.eliminar())
                {
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Se ha eliminado el cliente");
                    mensaje.ShowDialog();
                    limpiar();
                    habilitar(false);
                }
                else
                {
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("No se puede eliminar el cliente porque tiene facturas asociadas.");
                    mensaje.ShowDialog();
                }
            }
            catch (NullReferenceException ne)
            {
                GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe elegir un cliente de la lista a la izquierda para eliminarlo.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                error.ShowDialog();
            }
            catch (SqlException se)
            {
                GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + se.Message, "SqlException");
                error.ShowDialog();
            }
            catch (FormatException fe)
            {
                GLOMensajeError error = new GLOMensajeError("No se eligió un cliente.", "Debe buscar el cliente que desea eliminar oprimiendo el botón de buscar (binoculares).\n\n Mensaje técnico del error: " + fe.Message, "FormatException");
                error.ShowDialog();
            }
        }

        #endregion

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.Clientes;
            buscador.FormClosed += new FormClosedEventHandler(buscador_Closed);
            buscador.ShowDialog();
        }

        private void buscador_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                txtID.Text = Cache.cliente.Cells[0].Value.ToString();
                txtCedula.Text = Cache.cliente.Cells[1].Value.ToString();
                txtNombre.Text = Cache.cliente.Cells[4].Value.ToString();
                txtApellido1.Text = Cache.cliente.Cells[2].Value.ToString();
                txtApellido2.Text = Cache.cliente.Cells[3].Value.ToString();
                txtDireccion.Text = Cache.cliente.Cells[5].Value.ToString();
                txtCorreo.Text = Cache.cliente.Cells[10].Value.ToString();
                txtRegion.Text = Cache.cliente.Cells[6].Value.ToString();
                txtTel.Text = Cache.cliente.Cells[7].Value.ToString();
                txtTel2.Text = Cache.cliente.Cells[8].Value.ToString();
                txtCel.Text = Cache.cliente.Cells[9].Value.ToString();
                habilitar(true);
            }
            catch (NullReferenceException) { }
        }

        private void txtID_TextChanged(object sender, EventArgs e)
        {

        }

        private void lblID_Click(object sender, EventArgs e)
        {

        }

    }
}
